其實網路上已經有很多實作調色盤的範例,網路上蒐集到的方法:
首先我們可以先偷窺看看 UIColor 的實作方式:
open class UIColor : NSObject, NSSecureCoding, NSCopying {
open class var black: UIColor { get }
open class var darkGray: UIColor { get }
// ...
}
基本上是一個 Class 裡面有預設的系統顏色,每個系統顏色都是一個 UIColor 物件。
不過我實際測試沒辦法做到下列行為:
UIColor.black.black
實際要了解原因得去挖出 Swift 的原始碼,不過為了讓專案順利進行,先把這個衝動從腦中抹去。
回到主題,如果 UIColor 是個 Class,代表我們可以擴充 UIColor 來增加我們的顏色。
extension UIColor {
static var MMBlack = UIColor(red: 0x39 / 255, green: 0x3D / 255, blue: 0x3F / 255, alpha: 1)
static var MMWhite = UIColor(red: 0xFD / 255, green: 0xFD / 255, blue: 0xFF / 255, alpha: 1)
static var MMGreen = UIColor(red: 0x96 / 255, green: 0xE6 / 255, blue: 0xB3 / 255, alpha: 1)
static var MMRed = UIColor(red: 0xDA / 255, green: 0x3E / 255, blue: 0x52 / 255, alpha: 1)
static var MMBlue = UIColor(red: 0x8A / 255, green: 0xC4 / 255, blue: 0xFF / 255, alpha: 1)
}
使用方式如下:
view.backgroundColor = UIColor.MMBlue
缺點是為了避免跟 UIColor 原本的名稱衝突,所以顏色都要加上前綴 MM。
class MMColor {
static var black = UIColor(red: 0x39 / 255, green: 0x3D / 255, blue: 0x3F / 255, alpha: 1)
static var white = UIColor(red: 0xFD / 255, green: 0xFD / 255, blue: 0xFF / 255, alpha: 1)
static var green = UIColor(red: 0x96 / 255, green: 0xE6 / 255, blue: 0xB3 / 255, alpha: 1)
static var red = UIColor(red: 0xDA / 255, green: 0x3E / 255, blue: 0x52 / 255, alpha: 1)
static var blue = UIColor(red: 0x8A / 255, green: 0xC4 / 255, blue: 0xFF / 255, alpha: 1)
}
view.backgroundColor = MMColor.blue
其實做法跟方法一擴充 UIColor 是一樣的。
struct MMColor {
static var black = UIColor(red: 0x39 / 255, green: 0x3D / 255, blue: 0x3F / 255, alpha: 1)
static var white = UIColor(red: 0xFD / 255, green: 0xFD / 255, blue: 0xFF / 255, alpha: 1)
static var green = UIColor(red: 0x96 / 255, green: 0xE6 / 255, blue: 0xB3 / 255, alpha: 1)
static var red = UIColor(red: 0xDA / 255, green: 0x3E / 255, blue: 0x52 / 255, alpha: 1)
static var blue = UIColor(red: 0x8A / 255, green: 0xC4 / 255, blue: 0xFF / 255, alpha: 1)
}
view.backgroundColor = MMColor.blue
最終我還是決定用方法三,因為目前我還沒想到有什麼需求是需要把這些顏色定義成 Class,而且擴充 UIColor 的做法,會讓每個顏色都加上前綴,看起來不夠優雅。
最終,我們新增了一個檔案 MMColor.swift 來放調色盤的 Struct,目前目錄結構如下:
Money Mom
├── AppDelegate.swift
├── Assets.xcassets
├── Base.lproj
├── Info.plist
└── MMColor.swift <--- 主角在這
2 directories, 3 files
有了這樣一個 MMColor 的 Struct,未來我們介面需要顏色的地方,都能很輕易地使用這個 Struct 上色;如果需要調整色碼,只需要修改這個 Struct 就可以了。